/*
 * mtask.h
 *
 *  Created on: 2016年12月4日
 *      Author: pengzhikang
 */

#ifndef MTASK_H_
#define MTASK_H_ 1

#include "memory.h"
#include "fifo.h"
#include "console.h"
#include "file.h"

//最大任务数
#define MAX_TASKS 1000
#define MAX_TASKS_LV 100
#define MAX_TASKLEVELS 10
//定义从GDT的几号开始分配给TSS
#define TASK_GDT0 3

/** task初始化*/
#define TASK_INIT 0
/** 正在使用但没工作的的状态*/
#define TASK_USE 1
#define TASK_SLEEP TASK_USE
/** 正在活动*/
#define TASK_ACTIVITY 2

struct TSS32 {
	int backline, esp0, ss0, esp1, ss1, esp2, ss2, cr3;
	int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi;
	int es, cs, ss, ds, fs, gs;
	int ldtr, iomap;
};

/**
 * sel 用来存放GDT的编号
 * flags 任务状态
 * level 任务级别 0->9
 * priority 优先级1->10
 * ds_base 数据段基地址
 * cons_stack 栈地址
 * cmdline 当前输入的命令行
 * langmode 语言模式
 * sbcCaseByteOne 全角字符用来存放第一个字节内容
 */
struct TASK {
	int sel, flags;
	int level, priority; // 优先级1-10
	struct FIFO32 *fifo;
	struct TSS32 tss;
	struct SEGMENT_DESCRIPTOR *ldt[2];
	struct CONSOLE *cons;
	int ds_base, cons_stack;
	struct FILEHANDLE *fhandle;
	int *fat;
	char *cmdline;
	char langmode, sbcCaseByteOne;
};

/**
 * running 正在运行的任务数
 * now 记录当前正在运行的是哪个任务
 */
struct TASKLEVEL {
	int running;
	int now;
	struct TASK *tasks[MAX_TASKS_LV];
};

/**
 * now_lv 正在活动的LEVEL
 * lv_change 在下次任务切换时是否需要改变LEVEL
 * task0 存放所有任务
 */
struct TASKCTL {
	int now_lv;
	char lv_change;
	struct TASKLEVEL level[MAX_TASKLEVELS];
	struct TASK tasks0[MAX_TASKS];
};

// TASKLEVEL相关函数
/**
 * 获取当前活动中的TASk内存地址
 */
struct TASK *task_now(void);
/**
 * 向指定的TASKLEVEL添加任务
 */
void task_add(struct TASK *task);

void task_switchsub(void);

//其他
/**
 *
 */
struct TASK *task_init(struct MEMMAN *memman);
struct TASK *task_alloc(void);
/**
 * priority 任务优先级别 1-->10,小-->大, 0.02-->0.1,如果为0唤醒睡眠的任务
 */
void task_run(struct TASK *task, int level, int priority);
void task_switch(void);
void task_sleep(struct TASK *task);
void task_idle(void);
struct TASK *task_invoke_method(int method_point, int parameter[]);

#endif /* MTASK_H_ */
